package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.MenuDao;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.dao.UserDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.pojo.Menu;
import com.itheima.health.pojo.Role;
import com.itheima.health.pojo.User;
import com.itheima.health.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Service
@Transactional
public class MenuServiceImpl implements MenuService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private MenuDao menuDao;

    /**
     * 根据用户名动态展示菜单栏
     *
     * @param username
     * @return
     */
    @Override
    public List<Menu> getMenu(String username) {
        //获取用户信息
        User user = userDao.findByUsername(username);
        Integer userId = user.getId();
        //获取用户角色信息
        Set<Role> roleSet = roleDao.findByUserId(userId);
        //创建一个集合用来返回给前端
        List<Menu> menuResult = new ArrayList<>();
        for (Role role : roleSet) {
            //遍历获取角色的id
            Integer roleId = role.getId();
            //通过角色id获取菜单集合
            //menus代表该用户所有菜单信息
            List<Menu> menuList = menuDao.findByRoleId(roleId);
            //创建一个集合用来存子菜单
            List<Menu> menuChild = new ArrayList<>();
            //创建一个父类菜单对象
            Menu menuParent = new Menu();
            //遍历所有菜单信息
            for (Menu menu : menuList) {
                //取出每个菜单信息的父菜单id
                Integer parentMenuId = menu.getParentMenuId();
                //如果菜单的ID为空,该菜单为父菜单.
                if (parentMenuId == null) {
                    //父类菜单中添加 子菜单集合
                    menuParent.setChildren(menuChild);
                    //将遍历出来的父菜单赋值给menuParent对象
                    menuParent = menu;
                    //将menuParent添加到结果集合中
                    menuResult.add(menuParent);
                    //创建新的子菜单集合
                    menuChild = new ArrayList<>();
                } else if (parentMenuId != null) {

                    //否则为子菜单
                    //判断改子菜单的父id与menuParent对象中存的id是否一致
                    if (menu.getParentMenuId() == menuParent.getId()) {
                        //一致时将该子菜单加入到子菜单集合中
                        menuChild.add(menu);
                    }
                }
            }
            menuParent.setChildren(menuChild);
        }
        return menuResult;
    }

    /**
     * 分页查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        Page<Menu> page = menuDao.selectByCondtion(queryPageBean.getQueryString());
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 添加菜单项
     * @param menu
     */
    @Override
    public void add(Menu menu) {
        menuDao.add(menu);
    }


    /**
     * 删除菜单项
     * @param id
     */
    @Override
    public void deleteById(Integer id) {
        menuDao.deleteById(id);
    }

    /**
     * 根据id查询菜单项
     * @param id
     * @return
     */
    @Override
    public Menu findById(Integer id) {
        return menuDao.findById(id);
    }

    /**
     * 编辑菜单项
     * @param menu
     */
    @Override
    public void edit(Menu menu) {
        menuDao.edit(menu);
    }

    @Override
    public List<Menu> findAll() {

        return menuDao.findAll();

    }
}

